;能够将第二个扇区的内容加载进入内存（loader.asm）
;将loader放入0x900

LOADER_BASE_ADDR equ 0x900			;存入的内存地址
LOADER_START_SECTOR equ 0x2			;代码存在于磁盘第二扇区

SECTION MBR vstart=0x7c00
	mov ax,cs
	mov ds,ax
	mov es,ax
	mov ss,ax
	mov fs,ax
	mov sp,0x7c00
	mov ax,0xb800
	mov gs,ax
	
;利用0X06的功能，调用十号中断，清屏
;AH = 0x06
;AL = 0 表示全部清除
;BH = 上卷行属性 
;(CL,CH)左上角xy
;(DL,DH)右下角xy
	mov ax,0600h
	mov bx,0700h
	mov cx,0
	mov dx,184fh  ;(80,25)
	
	int 10h
	
;输出当前我们在MBR
	mov byte [gs:0x00], '1'
	mov byte [gs:0x01], 0xA4
	mov byte [gs:0x02], ' '
	mov byte [gs:0x03], 0xA4
	mov byte [gs:0x04], 'M'
	mov byte [gs:0x05], 0xA4
	mov byte [gs:0x06], 'B'
	mov byte [gs:0x07], 0xA4
	mov byte [gs:0x08], 'R'
	mov byte [gs:0x09], 0xA4
	
	mov eax,LOADER_START_SECTOR    ;LBA读入扇区
	mov bx,LOADER_BASE_ADDR			;写入地址
	mov cx,1						;待写入扇区数
	call rd_disk
	
	jmp LOADER_BASE_ADDR			;跳到实际物理地址
	
rd_disk:
;eax LBA扇区号
;bx 写入地址
;cx 读入扇区数
	
	mov esi,eax						;备份eax
	mov di,cx						;备份cx
	
;读写硬盘
	mov dx, 0x1f2					;将读入扇区数目写到端口0x1f2（sector count寄存器 ）
	mov al,cl
	out dx,al						
	
	mov eax,esi						;将LBA地址写入端口0x1f3——0x1f6（三个LBA寄存器）
	mov dx,0x1f3
	out dx,al						;将7-0写入0x1f3
	
	mov cl,8
	shr eax,cl
	mov dx,0x1f4
	out dx,al						;将15-8写入0x1f4
	
	shr eax,cl
	mov dx,0x1f5
	out dx,al						;将15-8写入0x1f5
	
	
	shr eax,cl				
	and al,0x0f						;取LBA前四位地址放到device寄存器前四位
	or al,0xe0						;将高四位设置为（1110），此时为LBA模式
	mov dx,0x1f6			
	out dx,al						;设置devic寄存器
	
	mov dx,0x1f7					;设置command寄存器（0x20读，0x30写）
	mov al,0x20
	out dx,al
	
	
	;检测硬盘状态
	.not_ready:
	nop
	in al,dx
	and al,0x88				;取出第四位和第7位检查
	cmp al,0x08				;第7位未忙，第四位为准备好
	jnz .not_ready
	
	;读数据
	mov ax,di				;计算双字节读入需要重复次数
	mov dx,256
	mul dx
	mov cx,ax
	mov dx,0x1f0
	
	.go_on:
		in ax,dx
		mov [bx],ax
		add bx,2
		loop .go_on
		ret
		
	times 510 - ($-$$) db 0
	dw 0xaa55
	